/***************************************************************************/
/* NOTE:                                                                   */
/* This document is copyright (c) by Oz Solomonovich.  All non-commercial  */
/* use is allowed, as long as this document not altered in any way, and    */
/* due credit is given.                                                    */
/***************************************************************************/

// DSWindow.cpp : implementation file
//
// This is a specialized tab manager window used to subclassed DevStudio
// document windows.  It's main responsibility is to manage the difference
// between zoomed and normal window states (zoomed windows require room
// for the tabs).
//

//this line was inserted and notified to you
//I remove some function or porpert which this addin do not use
//it cound not be replaced by original file

#include "stdafx.h"
#include "TabBars.h"
#include "Commands.h"
#include "TabManagerWnd.h"
#include "TabBarWnd.h"
//#include "Options.h"
#include "Commands.h"
#include "DSWindow.h"
//#include "Config.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#define SWP_NOEVERYTHING  \
    (SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE)


/////////////////////////////////////////////////////////////////////////////
// CDSWindow

//##ModelId=431C34CB030F
CDSWindow::CDSWindow(IGenericWindow *pGWindow, HWND hDSWindow, 
    CTabBarsWnd *pTabsWnd) : CTabManagerWindow(pGWindow, hDSWindow)
{
    m_cResizeRef = 0;
    m_bLastZoom  = FALSE;
    m_LastOrientation = SnapOrientations(999);  // default: illegal value
    m_iTimerCount = 0;
//    m_idTimer = SetTimer(101, 100, NULL);
}

//##ModelId=431C34CB033C
CDSWindow::~CDSWindow()
{
    if (pGlobalActiveDSWindow == this)
    {
       pGlobalActiveDSWindow = NULL;
    }
}


BEGIN_MESSAGE_MAP(CDSWindow, CTabManagerWindow)
    //{{AFX_MSG_MAP(CDSWindow)
    ON_WM_WINDOWPOSCHANGING()
    ON_WM_DESTROY()
	ON_WM_CLOSE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CDSWindow message handlers

//##ModelId=431C34CB034B
void CDSWindow::OnDestroy() 
{
    KillTimer(m_idTimer);

    if (m_bManaging)
    {
        pGlobalTabs->ShowWindow(SW_HIDE);
    }

    // BUG BUG: DevStudio won't issue a Window Deactivation event when the
    // last window is closed.  we'll overcome this by forcing a tab update
    // after each window is closed
    if (cfg_iSnap == ssMDI)
    {
        pGlobalTabs->UpdateTabs();
    }

    CTabManagerWindow::OnDestroy();
}

//##ModelId=431C34CB036D
void CDSWindow::PostNcDestroy() 
{
    if (pGlobalActiveDSWindow == this)
    {
        pGlobalActiveDSWindow = NULL;
        delete this;
    }

    CTabManagerWindow::PostNcDestroy();
}

// This timer even is used to periodically check that the tabs are in sync.
// with the current window list.  Since a full tab update takes time and
// may cause unwanted flicker, it is done only every 10 timer calls.  In all
// other cases, the tabs are updated if the number of windows isn't the same
// as the number of tabs (see below).
//##ModelId=431C34CB035B
void CDSWindow::OnTimer(UINT nIDEvent) 
{
    // first, a sanity check:
    ASSERT(this == pGlobalActiveDSWindow);    
    ASSERT(pGlobalTabs);

    CTabManagerWindow::OnTimer(nIDEvent);

    if (nIDEvent == m_idTimer)
    {
/*        if (++m_iTimerCount == cfg_iRefreshInterval  &&  cfg_bAutoRefresh)
        {
            // Refresh at the given auto-refresh rate.  Sometimes things like
            // asterisks on tabs aren't updated, and we can compensate for
            // that be forcing the tabs to update
            PostUpdateMessage();
            m_iTimerCount = 0;
        }
        else
*/        {
            // Quick check: update only if the number of windows changed.  
            // When the user causes a docked DevStudio window (i.e. Output,
            // Disassembly, etc.) to open or close, we get no direct 
            // notification.  In some circumstances, the only evidence that 
            // anything changed is the fact that the number of windows isn't
            // the same as the number of tabs.
            // This check is preformed every 1/2 second.
            if ((m_iTimerCount % 5) == 0)
            {
                CheckTabCount();
            }                
        }
    }
}

//##ModelId=431C34CB033E
void CDSWindow::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
{
    if ((lpwndpos->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE))
    {
        // Sometimes, this function is called twice for the same window area 
        //  (e.g. when running a program), thus the window's size might be 
        //  decreased too much.  
        //  We use reference counting to assure that the window size is only
        //  changed once (m_cResizeRef).

        m_cResizeRef++;

        if (m_cResizeRef == 1)
        {
            if (IsZoomed() != m_bLastZoom   || cfg_iOrientation != m_LastOrientation)
            {
                m_bLastZoom = IsZoomed();
                m_LastOrientation = SnapOrientations(cfg_iOrientation);

                // Zoomed windows need to be resized to make room for the 
                //  tabs.  They also need a border.
                if (m_bLastZoom)
                {
                    int cyCaption = GetSystemMetrics(SM_CYCAPTION) + 4;

                    if(cfg_iOrientation == soBottom)
                    {
                        SetBorder(CRect(4, 0, 0, 3));
                    }

                    SetMakeSpace(true);
                }
                else
                {
                    SetBorder(CRect(0, 0, 0, 0));
                    SetMakeSpace(false);
                }
            }
        }

        m_cResizeRef--;
    }
    else
    {
        int i = 0;
    }

    CTabManagerWindow::OnWindowPosChanging(lpwndpos);
}


/////////////////////////////////////////////////////////////////////////////
// CDSWindow attributes

//##ModelId=431C34CB031F
bool CDSWindow::SetManaging(bool bManaging)
{
    if (m_bManaging  &&  !bManaging)
    {
        pGlobalTabs->ShowWindow(SW_HIDE);
    }

    return CTabManagerWindow::SetManaging(bManaging);
}

// needed for compatibility with Visual Assist 
//##ModelId=431C34CB032D
HWND CDSWindow::GetSaferHwnd()
{
    if (!this) 
			return NULL;
    return ::IsWindow(m_hWnd)? m_hWnd : NULL;
}
